import FilterLayout from './FilterLayout.js';
const ExpandFilter = (hook, { ActionButtons, Collapse, CollapseItem }) => {
	return {
		isJiess: true,
		name: 'ExpandFilter',
		setup({
			midder,
			// 重置事件
			onReset,
			// 搜索事件
			onSearch,
			// 单组件宽度
			span = 8,
			// 筛选区表单参数
			formParam = {},
			// 布局参数
			layoutParam,
			// 重置方案
			// 1.加载列表，2.清空列表
			// 其余情况不对列表做处理
			resetPlan = 1,
			// 筛选区初始回显参数
			initialValues = {},
			// 提供用于渲染的函数集合对象
			filterItems,
			// 筛选区变化时调用
			onValuesChange,
			// 筛选默认区配置参数
			areaDefaultParam = { hasRule: true },
			// 筛选展开区配置参数
			areaExpandParam = { hasRule: true },
			// 其它配置区参数
			...areaParam
		} = {}) {
			const { filter = {}, table, pager, proxy } = midder || {};
			// 基础的筛选参数
			let baseValues = null;
			// 计算得到单行组件数量
			const num = 24 / span;
			// 权重放置在渲染函数对象上，没有提供权重，则默认权重为 1000
			const getWeight = o => typeof o.weight === 'number' ? o.weight : 1000;
			// 从通用渲染器上获取渲染函数对象，并根据权重排序
			const fns = Object.values((() => {
				if (typeof filterItems === 'function') {
					return filterItems.call(this, midder);
				} else {
					return filter.items;
				}
			})()).sort((a, b) => getWeight(b) - getWeight(a));
			// 分别初始化得到默认区和展开区的操作对象
			const initCnf = o => ({
				span,
				formParam,
				initialValues,
				hasCard: false,
				spaceParam: { py: 0 },
				...areaParam,
				...o
			});
			// 加载默认的筛选数据，用于回显
			filter.load = (values = { ...baseValues }) => {
				filter.values = values;
				filter.defaultDone.action.setFieldsValue(values);
				filter.expandDone?.action.setFieldsValue(values);
			};
			// ========================================
			filter.toValidate = async () => {
				const { defaultDone, expandDone } = filter;
				// 校验默认区表单数据
				filter.values = await defaultDone.action.value();
				// 如过存在展开区，则需要校验展开区表单数据
				if (fns.length > num) {
					const vals = await expandDone.action.value();
					Object.assign(filter.values, vals);
				}
			};
			filter.onSearch = async (callback) => {
				await filter.toValidate();
				// 搜索和筛选均需要重置页码
				pager && (pager.values.page = 1);
				if (typeof onSearch === 'function') {
					onSearch.call(this, filter.values)
				} else if (typeof callback === 'function') {
					callback.call(this, filter.values)
				} else {
					table?.reload();
				}
				// 手动触发时，返回筛选值
				return filter.values;
			};
			filter.onReset = async () => {
				filter.load();
				if (typeof onReset === 'function') {
					onReset.call(this, filter.values)
				} else {
					return await filter.onSearch(() => {
						// 根据既定方案处理列表
						if (resetPlan === 1) {
							table?.reload();
						} else if (resetPlan === 2) {
							if (proxy) {
								proxy.datas = [];
								proxy.total = 0;
							}
						}
					});
				}
			};
			// ========================================
			(() => {
				const custom = { ...areaDefaultParam };
				const param = initCnf(custom);
				// 存在验证时，需要强制向上18px；中和底部18px的校验显示区
				param.formParam['jiess-has-rule'] = !!param.hasRule + '';
				const area = filter.areaDefault = this.area(param);
				area.add(fns.slice(0, num).map(fn => fn.call(this, area)));
				filter.defaultDone = area.done(false);
			})();
			// ========================================
			(() => {
				const areaParam = initCnf(areaExpandParam);
				areaParam.formParam = areaParam.formParam || {};
				Object.assign(areaParam.formParam, {
					style: { marginRight: '20px' }
				});
				const area = filter.areaExpand = this.area(areaParam);
				area.add(fns.slice(num).map(fn => fn.call(this, area)));
				filter.expandDone = area.done(false);
			})();
			// ========================================
			this.add({
				filter,
				Collapse,
				CollapseItem,
				ActionButtons,
				is: FilterLayout,
				isCollapse: fns.length > num,
				...layoutParam,
				$slots: {
					default: () => filter.defaultDone.node,
					expand: () => filter.expandDone.node
				}
			});
			// ==============================================================
			this.onMounted(() => {
				hook.$m.$watchEffect(() => {
					// 观察筛选框数据的变化，及时的更新挂载筛选数据
					const { areaDefault, areaExpand } = filter;
					const result = { ...areaDefault.nameManger.values };
					if (areaExpand) {
						Object.assign(result, areaExpand.nameManger.values)
					}
					// 基础数据还未初始化，则初始化赋值，作为重置基准
					if (!baseValues) baseValues = { ...result };
					// 向外暴露未经过处理的原始数据
					onValuesChange && onValuesChange(result);
				});
			})
		}
	}
};
export default ExpandFilter;